package org.example.movies.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 *	1. 声明静态数据源成员变量
 * 	2. 创建连接池对象
 * 	3. 定义公有的得到数据源的方法
 * 	4. 定义得到连接对象的方法
 * 	5. 定义关闭资源的方法
 *
 */
public class JDBCUtils {
	// 1. 声明静态数据源成员变量
	private static DataSource ds;

	// 2. 创建连接池对象
	static {
		// 加载配置文件中的数据
		InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
		Properties pro = new Properties();
		try {
			pro.load(is);
			// 创建连接池，使用配置文件中的参数
			ds = DruidDataSourceFactory.createDataSource(pro);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 定义公有的得到数据源的方法
	 * @return
	 */
	public static DataSource getDataSource() {
		return ds;
	}

	/**
	 * 定义得到连接对象的方法
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		return ds.getConnection();
	}

	/**
	 * 开启事务
	 */
	public static void begin() {
		try {
			getConnection().setAutoCommit(false);
		} catch (SQLException throwables) {
			throwables.printStackTrace();
		}
	}

	/**
	 * 回滚事务
	 */
	public static void rollback() {
		try {
			getConnection().rollback();
		} catch (SQLException throwables) {
			throwables.printStackTrace();
		}
	}

	/**
	 * 提交事务
	 */
	public static void commit() {
		try {
			getConnection().commit();
		} catch (SQLException throwables) {
			throwables.printStackTrace();
		}
	}

	/**
	 * 定义关闭资源的方法
	 * @param conn
	 * @param stmt
	 * @param rs
	 */
	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
				rs = null;
			} catch (SQLException e) {}
		}

		if (stmt != null) {
			try {
				stmt.close();
				stmt = null;
			} catch (SQLException e) {}
		}

		if (conn != null) {
			try {
				conn.close();
				conn = null;
			} catch (SQLException e) {}
		}
	}

	// 6.重载关闭方法
	public static void close(Connection conn, Statement stmt) {
		close(conn, stmt, null);
	}
}
